<?php
/**
 * 熵巡 - 企业级氚云OpenAPI数据管理平台
 * 开发归属 Alyr.net
 * 日志管理类 - 统一日志写入和自动清理
 * 尊重劳动成果是一种美德
 */

class LogManager {
    /**
     * 日志文件最大大小（字节）
     * 默认 5GB = 5 * 1024 * 1024 * 1024 字节
     */
    private $maxFileSize;
    
    /**
     * 日志目录
     */
    private $logDir;
    
    /**
     * 日志文件名
     */
    private $logFileName;
    
    /**
     * 完整日志文件路径
     */
    private $logFilePath;
    
    /**
     * 构造函数
     * 
     * @param string $logDir 日志目录路径
     * @param string $logFileName 日志文件名（如：api_debug.log）
     * @param int $maxSizeGB 日志文件最大大小（GB），默认 5GB
     */
    public function __construct($logDir, $logFileName, $maxSizeGB = 5) {
        $this->logDir = rtrim($logDir, '/') . '/';
        $this->logFileName = $logFileName;
        $this->logFilePath = $this->logDir . $this->logFileName;
        $this->maxFileSize = $maxSizeGB * 1024 * 1024 * 1024; // 转换为字节
        
        // 确保日志目录存在
        if (!is_dir($this->logDir)) {
            mkdir($this->logDir, 0755, true);
        }
    }
    
    /**
     * 写入日志
     * 
     * @param string $message 日志消息
     * @param string $level 日志级别（INFO, DEBUG, WARNING, ERROR）
     * @return bool 写入是否成功
     */
    public function write($message, $level = 'INFO') {
        // 检查文件大小，超过限制则删除
        $this->checkAndCleanup();
        
        // 格式化日志条目
        $timestamp = date('Y-m-d H:i:s');
        $logEntry = "[{$timestamp}] [{$level}] {$message}\n";
        
        // 写入日志文件
        return file_put_contents($this->logFilePath, $logEntry, FILE_APPEND | LOCK_EX) !== false;
    }
    
    /**
     * 检查文件大小并清理
     * 如果日志文件超过最大限制，则删除旧文件
     * 
     * @return void
     */
    private function checkAndCleanup() {
        // 如果文件不存在，无需清理
        if (!file_exists($this->logFilePath)) {
            return;
        }
        
        // 获取文件大小
        $fileSize = filesize($this->logFilePath);
        
        // 如果超过最大限制，删除文件
        if ($fileSize >= $this->maxFileSize) {
            // 备份文件名（可选）
            $backupName = $this->logDir . pathinfo($this->logFileName, PATHINFO_FILENAME) 
                        . '_' . date('YmdHis') . '.bak';
            
            // 重命名为备份文件（保留历史）
            @rename($this->logFilePath, $backupName);
            
            // 删除备份文件（如果不需要保留历史，直接删除）
            @unlink($backupName);
            
            // 记录清理操作（写入新文件）
            $cleanupMsg = "[" . date('Y-m-d H:i:s') . "] [SYSTEM] 日志文件超过 " 
                        . round($this->maxFileSize / (1024 * 1024 * 1024), 2) 
                        . "GB，已自动清理。原文件大小: " 
                        . round($fileSize / (1024 * 1024 * 1024), 2) . "GB\n";
            
            file_put_contents($this->logFilePath, $cleanupMsg, FILE_APPEND | LOCK_EX);
        }
    }
    
    /**
     * 获取日志文件当前大小（格式化）
     * 
     * @return string 格式化的文件大小
     */
    public function getFileSize() {
        if (!file_exists($this->logFilePath)) {
            return '0 B';
        }
        
        $bytes = filesize($this->logFilePath);
        $units = ['B', 'KB', 'MB', 'GB', 'TB'];
        
        for ($i = 0; $bytes >= 1024 && $i < count($units) - 1; $i++) {
            $bytes /= 1024;
        }
        
        return round($bytes, 2) . ' ' . $units[$i];
    }
    
    /**
     * 获取日志文件路径
     * 
     * @return string 日志文件完整路径
     */
    public function getLogFilePath() {
        return $this->logFilePath;
    }
    
    /**
     * 手动清理日志文件
     * 
     * @return bool 清理是否成功
     */
    public function manualCleanup() {
        if (file_exists($this->logFilePath)) {
            return @unlink($this->logFilePath);
        }
        return true;
    }
}
?>
